/**
 * 页面通用行为
 * 提供统一的加载、错误、空状态处理
 */

const LoadingManager = require('./loading');
const ErrorHandler = require('./errorHandler');
const StateManager = require('./state');
const { updateTabBar, getGreeting } = require('./common');
const auth = require('./auth');

/**
 * 页面通用行为
 * 在页面中使用：behaviors: [require('../../utils/pageBehavior')]
 */
module.exports = Behavior({
  data: {
    loading: false,
    error: '',
    empty: false,
    emptyText: '暂无数据',
    emptyImage: ''
  },

  lifetimes: {
    created() {
      // 初始化加载管理器
      this.loadingManager = new LoadingManager(this, 'loading');
    },

    detached() {
      // 清理加载状态
      if (this.loadingManager) {
        this.loadingManager.reset();
      }
    }
  },

  methods: {
    /**
     * 设置加载状态
     * @param {Boolean} loading - 是否加载中
     */
    setLoading(loading) {
      if (loading) {
        this.loadingManager.start();
      } else {
        this.loadingManager.stop();
      }
    },

    /**
     * 设置错误状态
     * @param {String|Error} error - 错误消息或错误对象
     * @param {Object} options - 配置选项
     */
    setError(error, options = {}) {
      const message = ErrorHandler.handleApiError(error, {
        showToast: options.showToast !== false,
        defaultMessage: options.defaultMessage
      });
      
      this.setData({
        error: message,
        loading: false,
        empty: false
      });
    },

    /**
     * 清除错误状态
     */
    clearError() {
      this.setData({
        error: ''
      });
    },

    /**
     * 设置空状态
     * @param {Boolean} empty - 是否为空
     * @param {String} text - 空状态文字
     * @param {String} image - 空状态图片
     */
    setEmpty(empty, text = '暂无数据', image = '') {
      this.setData({
        empty,
        emptyText: text,
        emptyImage: image,
        loading: false,
        error: ''
      });
    },

    /**
     * 执行异步操作，自动管理加载和错误状态
     * @param {Function} asyncFn - 异步函数
     * @param {Object} options - 配置选项
     * @returns {Promise} 异步操作的结果
     */
    async executeAsync(asyncFn, options = {}) {
      const {
        showLoading = true,
        loadingText = '加载中...',
        showError = true,
        onSuccess,
        onError
      } = options;

      try {
        this.clearError();
        
        if (showLoading) {
          this.loadingManager.start({ showToast: false });
        }

        const result = await asyncFn();
        
        if (showLoading) {
          this.loadingManager.stop();
        }

        if (onSuccess) {
          onSuccess(result);
        }

        return result;
      } catch (error) {
        if (showLoading) {
          this.loadingManager.stop();
        }

        if (showError) {
          this.setError(error, { showToast: true });
        }

        if (onError) {
          onError(error);
        }

        throw error;
      }
    },

    /**
     * 显示成功提示
     * @param {String} message - 提示消息
     */
    showSuccess(message) {
      StateManager.showSuccess(message);
    },

    /**
     * 显示错误提示
     * @param {String} message - 错误消息
     */
    showError(message) {
      StateManager.showError(message);
    },

    /**
     * 显示确认对话框
     * @param {Object} options - 配置选项
     * @returns {Promise<Boolean>} 用户选择
     */
    showConfirm(options) {
      return StateManager.showConfirm(options);
    },

    /**
     * 更新 TabBar 选中状态
     * @param {Number} index - TabBar 索引（0-3）
     */
    updateTabBar(index) {
      updateTabBar(this, index);
    },

    /**
     * 检查认证状态，未认证则跳转登录
     * @param {String} redirectUrl - 登录后重定向的URL（可选）
     * @returns {Boolean} 是否已认证
     */
    requireAuth(redirectUrl = '') {
      return auth.requireAuth(redirectUrl);
    },

    /**
     * 检查认证状态
     * @returns {Boolean} 是否已认证
     */
    checkAuth() {
      return auth.checkAuth();
    },

    /**
     * 获取问候语
     * @returns {String} 问候语
     */
    getGreeting() {
      return getGreeting();
    }
  }
});

